package com.Algorithm.HUAWEI.two20220303;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zjz
 * @Date: 2022/03/16/11:11
 * @Description:
 * @Target:
 */
public class 查找兄弟单词 {
    /*
    * 定义一个单词的“兄弟单词”为：交换该单词字母顺序（注：可以交换任意次），而不添加、删除、修改原有的字母就能生成的单词。
        兄弟单词要求和原来的单词不同。例如： ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
        现在给定你 n 个单词，另外再给你一个单词 x ，让你寻找 x 的兄弟单词里，按字典序排列后的第 k 个单词是什么？
        注意：字典中可能有重复单词。

        数据范围1≤n≤1000 ，输入的字符串长度满足 x1≤len(str)≤10  1≤k<n
        输入描述：
        输入只有一行。 先输入字典中单词的个数n，再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
        输出描述：
        第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词，没有符合第k个的话则不用输出。
        示例1
        输入：
        3 abc bca cab abc 1
        复制
        输出：
        2
        bca
        复制
        示例2
        输入：
        6 cab ad abcd cba abc bca abc 1
        复制
        输出：
        3
        bca
        复制
        说明：
        abc的兄弟单词有cab cba bca，所以输出3
        经字典序排列后，变为bca cab cba，所以第1个字典序兄弟单词为bca
    *
    * */


    public static void main(String[] args) throws Exception {
/*
*
*  3 abc bca cab abc 1
        输出：
        2
        bca
* */


        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        String[] s = in.readLine().split(" ");
        String[] strings = new String[Integer.valueOf(s[0])];
        int count = 0;
        for (int i = 0; i < strings.length; i++) {
            if (isBrother(s[s.length-2], s[i+1])) {
                strings[i] = s[i+1];
                count++;
            }else {
                strings[i] = "{{";
            }
        }


        Arrays.sort(strings);

        System.out.println(count);

        if (Integer.valueOf(s[s.length-1])<=count){
            System.out.println(strings[Integer.valueOf(s[s.length-1])-1]);
        }
    }



    // 使用数组判断兄弟
    // 遍历原有的，然后数组增加。
    // 遍历现在的，数组减少
    // 如果都是0，那么就是兄弟
    static boolean isBrother(String target,String s1){
        boolean flag = true;
        // 可能是大写字母，也可能是小写字母，大写就排前面（0-25），小写排后面（26-51）
        int[] ints = new int[52];
        if (target.length()!=s1.length()||target.equals(s1)){
            flag = false;
        }

        if (flag==true){
            for (int i = 0; i < target.length(); i++) {
                if (target.charAt(i)>='a'&&target.charAt(i)<='z'){
                    ints[target.charAt(i)-'a'+26]++;
                }else if (target.charAt(i)>='A'&&target.charAt(i)<='Z'){
                    ints[target.charAt(i)-'A']++;
                }else {
                    flag = false;
                }
            }
        }



        if (flag==true) {
            for (int i = 0; i < s1.length(); i++) {
                if (s1.charAt(i) >= 'a' && s1.charAt(i) <= 'z') {
                    if ( ints[s1.charAt(i) - 'a' + 26]==0){
                        flag = false;
                        break;
                    }
                    ints[s1.charAt(i) - 'a' + 26]--;
                } else if (s1.charAt(i) >= 'A' && s1.charAt(i) <= 'Z') {
                    if ( ints[s1.charAt(i) - 'A']==0){
                        flag = false;
                        break;
                    }
                    ints[s1.charAt(i) - 'A']--;
                } else {
                    flag = false;
                }
            }

        }


        if (flag == true){
            int count = 0;
            for (int i = 0; i < ints.length; i++) {
                count+=ints[i];
            }
            if (count!=0){
                flag = false;
            }
        }

        return flag;
    }
}
